#include <iostream>

using std::cout;
using std::endl;

//全局变量和静态变量在内存中的位置是紧挨着的
//位于全局静态区
int gnum = 1;
static int snum = 2;

//位于程序代码区
void test()
{
    //位于test函数栈空间
    //tnum的生命周期与test函数保持一致
    int tnum = 10;
    cout << "tnum:" << tnum << endl;
}

//位于程序代码区
int main()
{
    int lnum = 3;   
    int * pnum = new int(4);

    //pstr指针本身位于栈空间，
    //但其指向的地址是位于文字常量区
    const char * pstr = "hello,world";
    cout << "pstr[0]: " << pstr[0] << endl;
    //pstr[0] = 'X';//error

    //arr数组是存放在栈区, 不在文字常量区
    //字符串的结尾会以 ‘\0’字符结束
    //字符数组
    char arr[] = "hello,world";
    arr[0] = 'X';//位于栈上，可以修改
    cout << "arr[0]: " << arr[0] << endl;

    test();//函数栈空间的控制是由操作系统进行的

    printf("&gnum: %p\n", &gnum);
    printf("&snum: %p\n", &snum);
    printf("&lnum: %p\n", &lnum);
    printf("&pnum: %p\n", &pnum);
    printf("pnum: %p\n", pnum);
    printf("&pstr: %p\n", &pstr);
    printf("pstr: %p\n", pstr);
    printf("arr: %p\n", arr);
    printf("sizeof(arr): %ld\n", sizeof(arr));
    printf("test: %p\n", test);
    printf("main: %p\n", main);

    return 0;
}
